package edu.ccut.saturn.studio.component.part;

import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.widgets.TableItem;


import edu.ccut.saturn.studio.component.common.CommonSet;
import edu.ccut.saturn.studio.component.model.ComponentModel;
import edu.ccut.saturn.studio.component.model.Parameter;

/**
 * 表格单元修改器
 * 
 * @author Bai Yucheng
 * 
 */
public class TableViewerCellModifier implements ICellModifier {
	private TableViewer tableViewer;
	private ComponentModel componentModel;

	public TableViewerCellModifier(TableViewer tv, ComponentModel dm) {
		this.tableViewer = tv;
		this.componentModel = dm;
	}

	// 返回是否可以被修改，true为可修改
	public boolean canModify(Object element, String property) {
		return true;
	}

	// 返回列的值：参数element是表格记录的对象，property是表格列的属性
	public Object getValue(Object element, String property) {
		Parameter parameterVO = (Parameter) element;
		if (property.equals("NAME")) {
			return String.valueOf(parameterVO.getName());
		} else if (property.equals("CLASS_TYPE")) {
			return classTypeIndex(parameterVO.getClassStr());
		} else if (property.equals("PASS_TYPE")) {
			return passingTypeIndex(parameterVO.getPassingType());
		} else if (property.equals("VALUE_KEY")) {
			return String.valueOf(parameterVO.getValueKey());
		} else if (property.equals("SCOPE")) {
			return scopeIndex(parameterVO.getScope() + "");
		} else if (property.equals("DESCRIPTION")) {
			return String.valueOf(parameterVO.getDescription());
		} else {
			return null;
		}
	}

	private int classTypeIndex(String str) {
		int index = 0;
		for (int i = 0; i < CommonSet.classTypes.length; i++) {
			if (CommonSet.classTypes[i].equals(str)) {
				return i;
			}
		}
		return index;
	}
	
	private int passingTypeIndex(String str) {
		int index = 0;
		for (int i = 0; i < CommonSet.passingTypes.length; i++) {
			if (CommonSet.passingTypes[i].equals(CommonSet.reverseConvert(str))) {
				return i;
			}
		}
		return index;
	}
	
	private int scopeIndex(String str) {
		int index = 0;
		for (int i = 0; i < CommonSet.scopes.length; i++) {
			if (CommonSet.scopes[i].equals(CommonSet.reverseConvert(str))) {
				return i;
			}
		}
		return index;
	}
	
	

	/**
	 * 修改表格单元中的值
	 * 
	 * @param element
	 *            表格记录的对象
	 * @param property
	 *            表格列的属性
	 * @param value
	 *            修改的新值
	 */
	public void modify(Object element, String property, Object value) {
		TableItem tableItem = (TableItem) element;
		Parameter parameterVO = (Parameter) tableItem.getData();
		if (property.equals("NAME")) {
			String newValue = (String) value;
			if (newValue.equals("")) {
				return;
			} else {
				parameterVO.setName(newValue);
			}
			componentModel.updateParameterValue(String.valueOf(parameterVO.getId()), ComponentModel.PARAMETER_ATTRIBUTE_NAME, newValue);
		}
		if (property.equals("CLASS_TYPE")) {
			String newValue = CommonSet.classTypes[(Integer) value];
			parameterVO.setClassStr(newValue);
			componentModel.updateParameterValue(String.valueOf(parameterVO.getId()), ComponentModel.PARAMETER_ATTRIBUTE_CLASSTYPE, newValue);
		}
		if (property.equals("PASS_TYPE")) {
			String newValue = CommonSet.convert(CommonSet.passingTypes[(Integer) value]);
			parameterVO.setPassingType(newValue);
			componentModel.updateParameterValue(String.valueOf(parameterVO.getId()), ComponentModel.PARAMETER_ATTRIBUTE_PASSINGTYPE, newValue);
		}
		if (property.equals("VALUE_KEY")) {
			String newValue = (String) value;
			if (newValue.equals("")) {
				return;
			} else {
				parameterVO.setValueKey(newValue);
			}
			componentModel.updateParameterChildValue(String.valueOf(parameterVO.getId()), ComponentModel.PARAMETER_ELEMENT_VALUEKEY, newValue);
		}
		if (property.equals("SCOPE")) {
			String newValue = CommonSet.convert(CommonSet.scopes[(Integer) value]);
			parameterVO.setScope(Integer.parseInt(newValue));
			componentModel.updateParameterChildValue(String.valueOf(parameterVO.getId()), ComponentModel.PARAMETER_ELEMENT_SCOPE, newValue);
		}
		if (property.equals("DESCRIPTION")) {
			String newValue = (String) value;
			if (newValue.equals("")) {
				return;
			} else {
				parameterVO.setDescription(newValue);
			}
			componentModel.updateParameterChildValue(String.valueOf(parameterVO.getId()), "description", newValue);
		}

		// 修改更新
		tableViewer.refresh();
	}
}